package com.lw.pool;

import java.util.concurrent.*;

/**
 * @author LW
 * @2020/8/20 22:07
 */
//Executors（执行者） 工具类  三大方法
    //开启线程的本质：都是new 一个ThreadPoolExecutor（线程池执行器）
public class Demo01 {

    /**
     * public ThreadPoolExecutor(int corePoolSize,  核心池大小（最小线程数）
     *                               int maximumPoolSize,  最大泳池面积（最大线程数）
     *                               long keepAliveTime,  保持时间（超时没人调用就会**释放**）
     *                               TimeUnit unit,   时间单位
     *                               BlockingQueue<Runnable> workQueue,   阻塞队列
     *                               ThreadFactory threadFactory,     线程工厂（创建线程的，一般-不动-）
     *                               RejectedExecutionHandler handler)   拒绝策略（拒绝执行处理程序）
     * 线程池本质的七个参数
     */
    public static void main(String[] args) {
        /**线程池的三大方法
         * ExecutorService threadPool = Executors.newSingleThreadExecutor();//单个线程
         * ExecutorService threadPool = Executors.newFixedThreadPool(5);//创建固定线程池大小
         * ExecutorService threadPool = Executors.newCachedThreadPool();//可伸缩的，遇强则强，遇弱则弱
         */


        //自定义线程池
        ExecutorService threadPool = new ThreadPoolExecutor(2, 10,
                2L, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(3),//容量（等待区）  超出三个就
                Executors.defaultThreadFactory(),//默认线程工厂
                new ThreadPoolExecutor.CallerRunsPolicy());//默认的拒绝策略
        //超出最大承载   AbortPolicy()会这里抛出异常
        try {
            //最大承载   Queue的容量+max
            for (int i = 0; i < 15; i++) {
                int temp = i;
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"===ok==="+temp);
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //线程池用完，程序结束，关闭线程池
            threadPool.shutdown();//卸载finally中保证程序跑完才关的
        }
    }
}
